package com.yochi.pictureseditor.images;

import com.yochi.pictureseditor.tools.Color;

/**
 * Cette classe explicite un objet image
 */
public class ImageImpl implements Image {
	
	private static final long serialVersionUID = 5689771325919776466L;

	//ATTRIBUTS//
	private char calques[][][];		//calques (profondeur-largeur-hauteur)
	private int profondeur;			//profondeur (nombre de calques)
	private int largeur;  			//largeur
	private int hauteur;			//hauteur
	
	
	//CONSTRUCTORS//
	
	public ImageImpl() {
		// nothing to do
	}
	
	/**
	 * Construit une image de taille profondeur - hauteur - largeur
	 */
	public ImageImpl(int profondeur, int largeur, int hauteur) {
		this.profondeur = profondeur;
		this.largeur = largeur;
		this.hauteur = hauteur;
		calques = new char[profondeur][largeur][hauteur];
	}

	
	//GETTERS//
	
	public int getProfondeur() { 
		return profondeur; 
	}
	
	public int getLargeur() { 
		return largeur; 
	}
	
	public int getHauteur() { 
		return hauteur; 
	}
	
	public char[][][] getCalques() {
		return calques;
	}
	
	
	//SETTERS//
	
	public void setLargeur(int largeur) {
		this.largeur = largeur;
	}
	
	public void setHauteur(int hauteur) {
		this.hauteur = hauteur;
	}
	
	public void setProfondeur(int profondeur) {
		this.profondeur = profondeur;
	}
	
	public void setCalques(char[][][] calques) {
		this.calques = calques;
	}

	
	//METHODS//
	
	public void setPixel(int profondeur, int largeur, int hauteur, char value) { 
		calques[profondeur][largeur][hauteur] = value;
	}
	
	public void setPixel(int largeur, int hauteur, Color color) {
		if(profondeur == 2) {
			char mean = (char) ((color.getR() + color.getG() + color.getB())/3);
			calques[0][largeur][hauteur] = mean;
			calques[1][largeur][hauteur] = mean;
			calques[2][largeur][hauteur] = mean;
			calques[3][largeur][hauteur] = getPixel(3, largeur, hauteur);
		} else if(profondeur == 4) {
			calques[0][largeur][hauteur] = color.getR();
			calques[1][largeur][hauteur] = color.getG();
			calques[2][largeur][hauteur] = color.getB();
			calques[3][largeur][hauteur] = getPixel(3, largeur, hauteur);
		}
	}
	
	public char getPixel(int profondeur, int largeur, int hauteur) { 
		return calques[profondeur][largeur][hauteur]; 
	}
	
	public char getAveragePixel(int largeur, int hauteur) {
		if(profondeur == 2) {
			return calques[0][largeur][hauteur];
			
		} else if (profondeur == 4) {
			return (char) ((calques[0][largeur][hauteur]+calques[1][largeur][hauteur]+calques[2][largeur][hauteur]) / 3);
		}
		return 0;
	}

	public void changeProfondeur(int profondeur) { 
		this.profondeur = profondeur; 
		this.calques = new char[profondeur][largeur][hauteur];
	}
	
}
